const { StepNameWorkflowRunner: StepWorkflowRunner } = require("../dify");

class StepAnalyzer {

    constructor() {
        this.stepNameWorkflowRunner = new StepWorkflowRunner();
    }

    /**
     * 
     * @param {{name: string, apis: Api[]|Api[][]}[]} groups 
     * @returns {Promise<{name: string, apis: Api[]|Api[][]}[]>}
     */
    async analyze(groups) {
        for (let i = 0; i < groups.length; i++) {
            let group = groups[i];
            let apis = group.apis;
            apis = StepAnalyzer._flattenAndJoinApis(apis);
            let stepName = await this.stepNameWorkflowRunner.getStepNameByApis(apis);
            if (stepName) {
                group.name = `${String(i + 1).padStart(3, "0")} ${stepName}`;
            }
        }
        return groups;
    }

    /**
     * 过滤嵌套的 API 数组，仅保留非数组类型的 API 对象，并将其路径字符串连接起来。
     * 该方法会遍历传入的 apis 数组，过滤掉所有数组类型的元素，
     * 只处理非数组类型的 API 对象，提取其 path 属性（若不存在则使用空字符串），
     * 最后将所有路径字符串用换行符连接起来。
     * @param {Api[]|Api[][]} apis - 可能嵌套的 API 对象数组。
     * @returns {string} - 由所有非数组 API 对象的路径字符串用换行符连接而成的字符串。
     */
    static _flattenAndJoinApis(apis) {
        return apis
            .filter(api => !Array.isArray(api)) // 过滤掉数组类型的元素
            .map(api => api.url.pathname || "") // 提取路径
            .join('\n'); // 连接字符串
    }

}

module.exports = StepAnalyzer;